﻿// Copyright (c) 2006 Antu Corporation。 
// 创建人  ：LiKun
// 创建时间：2006-09-26
using System;
using Microsoft.Practices.EnterpriseLibrary.ExceptionHandling;

namespace Antu.Business
{
    /// <summary>
    /// 异常管理
    /// </summary>
    /// <example>
    /// 以下示例代码演示了LogAndReplace的使用方法(其它方法的使用方法相同)
    /// <code>
    /// try
    /// {
    ///    //代码块
    /// }
    /// catch (Exception ex)
    /// {
    ///    LogAndReplace(ex);
    /// }
    /// </code>
    /// </example>
    /// <!--
    /// 创建人  : LiKun
    /// 创建时间: 2006-09-26
    /// -->
    public static class ExceptionManager
    {
        /// <summary>
        /// 将异常记入日志
        /// </summary>
        /// <param name="exception">异常</param>
        /// <remarks>仅将异常写入日志，不抛出</remarks>
        /// <!--
        /// 创建人  : LiKun
        /// 创建时间: 2006-09-26
        /// -->
        public static void LogOnly(Exception exception)
        {
            if (null == exception.InnerException)
            {
                HandleException(exception, "Log Only");
            }
        }

        /// <summary>
        /// 将异常记入日志，如page为空则抛出异常信息，否则在指定的page上弹出消息提示。
        /// </summary>
        /// <param name="exception">异常</param>
        /// <remarks>抛出的异常信息仅保留原Message属性，若要得到原异常通过InnerException属性获取。</remarks>
        /// <!--
        /// 创建人  : LiKun
        /// 创建时间: 2006-09-26
        /// -->
        public static void LogAndThrow(Exception exception)
        {
            if (null == exception.InnerException)
            {
                HandleException(exception, "Log And Throw");
            }
            else
            {
                throw exception;
            }
        }


        /// <summary>
        /// 将异常记入日志，如page为空则抛出替换后的异常信息，否则在指定的page上弹出消息提示。
        /// </summary>
        /// <param name="exception">异常</param>
        /// <remarks>替换后的异常信息在配置文件中设置。</remarks>
        /// <!--
        /// 创建人  : LiKun
        /// 创建时间: 2006-09-26
        /// -->
        public static void LogAndReplace(Exception exception)
        {
            if (null == exception.InnerException)
            {
                HandleException(exception, "Log And Replace");
            }
            else
            {
                throw exception;
            }
        }

        /// <summary>
        /// 处理异常
        /// </summary>
        /// <param name="exception">异常</param>
        /// <param name="policy">异常处理规则</param>
        /// <remarks>将异常抛出时，对其进行包装。将原异常放置在InnerException中</remarks>
        /// <!--
        /// 创建人  : LiKun
        /// 创建时间: 2006-09-26
        /// -->
        private static void HandleException(Exception exception, string policy)
        {
            bool rethrow = ExceptionPolicy.HandleException(exception, policy);
            if (rethrow)
            {
                throw new Exception(exception.Message, exception);
            }
        }
    }
}